package com.itxiaowu.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.google.gson.Gson;
import com.itxiaowu.constant.MessageConstant;
import com.itxiaowu.entity.PageResult;
import com.itxiaowu.entity.QueryPageBean;
import com.itxiaowu.entity.Result;
import com.itxiaowu.pojo.Menu;
import com.itxiaowu.pojo.Role;
import com.itxiaowu.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.*;

/**
 *  菜单
 */
@RestController
@RequestMapping("/menu")
public class MenuController {

    @Autowired
    private JedisPool jedisPool;
    @Reference
    private MenuService menuService;

    /**
     *  根据不同用户角色获得不同的 菜单列表     ----> 不知道是查询数据库好还是直接调用框架获得数据封装
     *                                          此处可以使用jedis 缓存存储菜单信息 ---> 后续注意当进行权限修改时需要删除缓存中的数据
     * @return
     */
    @RequestMapping("/getDifferentMenu.do")
    public Result getRoleMenu(){
        try {
            // 0: 封装数据的盒子
            List<Map<String,Object>> list = new LinkedList<>();  //  --> 使用链条不知道会不会出问题
            Jedis jedis = jedisPool.getResource();
            User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            /*
                1: 判断jedis数据库中是否由数据,有则直接取,无则进行下面的数据拿去
             */
            String menuList = jedis.get("menuList" + user.getUsername());
            if(menuList != null){

                // 转换赋值
                LinkedList linkedList = new Gson().fromJson(menuList, LinkedList.class);

                list = linkedList;
                System.out.println("长度是:" + linkedList.size());  // ---> 查看数据

            }else {
                /*
                 2.jedis中没有数据
                 */
                // 1: 获得用户数据  --> 从缓存中取数据需要得到用户名
                String userJson = jedis.get("user" + user.getUsername());
//            System.out.println("userJson格式数据: " + userJson);  -- > 查看数据

                // 2: 利用用户数据取出缓存中的用户信息 json格式 转换为 object对象数据
                com.itxiaowu.pojo.User userP = new Gson().fromJson(userJson, com.itxiaowu.pojo.User.class);

                // 3: 取出菜单数据信息
                // 3.1: 对应的角色信息
                Set<Role> roles = userP.getRoles();
                for (Role role : roles) {
                    // 3.2.1: 取出对应角色的菜单集合数据
                    LinkedHashSet<Menu> menus = role.getMenus();
                    for (Menu menu : menus) {
                        // 3.2.2 准备容器封装数据
                        Map<String, Object> map = new HashMap<>();

                        // 3.3: 封装数据   -->菜单数据所需  : path //菜单项所对应的路由路径    title: //菜单项名称   icon://图标  children 子菜单集合
                        String name = menu.getName();  // 标题名称

                        List<Menu> childrenMenu = menu.getChildren();  // 子菜单列表
                        if (childrenMenu != null && childrenMenu.size() > 0) {
                            // 3.3.2: 准备容器封装子菜单数据   -- > 集合或数组
                            List<Map<String, Object>> childList = new LinkedList<>();

                            for (Menu children : childrenMenu) {
                                // 子菜单所需数据  path: // 菜单项所对应的路径  title: 菜单项名称, icon:图标, children: 子子菜单集合
                                Map<String, Object> childrenMap = new HashMap<>();

                                childrenMap.put("path", children.getPath());
                                childrenMap.put("title", children.getName());
                                childrenMap.put("linkUrl", children.getLinkUrl());
                            /*
                                此处的字子菜单先放着, 以后数据添加再写
                             */
                                childrenMap.put("children", children.getChildren());

                                // 3.3.3: 将所需数据封装  ---> 子菜单数据封装
                                childList.add(childrenMap);
                            }

                            // 3.3.4: 将子菜单数据封装到 菜单数据中
                            map.put("children", childList);
                        }

                        map.put("path", menu.getPath());
                        map.put("title", name);
                        map.put("icon", menu.getIcon());

                        //3.3.5: 将菜单数据放入列表中
                        list.add(map);

                    /*
                        3.3.6: 将菜单数据放入jedis中
                     */
                        // 3.3.6.2:将list数据转换为json格式
                        String listJson = new Gson().toJson(list);
                        jedis.set("menuList" + user.getUsername(), listJson);
                    }
                }
            }
            // 4: 返回数据  , 关闭资源
            jedis.close();
            return new Result(true,MessageConstant.GET_MENU_SUCCESS,list);
        }catch (Exception e){
            return new Result(false, MessageConstant.GET_MENU_FAIL);
        }
    }

    //获取所有权限数据分页显示
    @RequestMapping("/findPage.do")
    public PageResult findPage(@RequestBody QueryPageBean queryPageBean) {
        PageResult pageResult = menuService.findPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize()
                , queryPageBean.getQueryString());
        return pageResult;
    }


}
